package cn.zyq.ykb.service.user;

import cn.zyq.ykb.beans.admin.Admin;
import cn.zyq.ykb.beans.config.ConfigBrokerage;
import cn.zyq.ykb.beans.sys.SysAdmin;
import cn.zyq.ykb.beans.task.bo.UserUpgradeBo;
import cn.zyq.ykb.beans.task.bo.UserUptTeamBo;
import cn.zyq.ykb.beans.user.User;
import cn.zyq.ykb.beans.user.UserBalance;
import cn.zyq.ykb.beans.user.UserCash;
import cn.zyq.ykb.beans.user.bo.BindAlipayBo;
import cn.zyq.ykb.beans.user.bo.FillInviteCodeBo;
import cn.zyq.ykb.beans.user.bo.UserUptRatioBo;
import cn.zyq.ykb.beans.user.bo.WxLoginBo;
import cn.zyq.ykb.beans.user.dto.UserLoginDto;
import cn.zyq.ykb.beans.user.vo.GetUserNumberVo;
import cn.zyq.ykb.beans.user.vo.GetUserVo;
import cn.zyq.ykb.beans.user.vo.MyTem;
import cn.zyq.ykb.beans.user.vo.UserWalletDetailVo;
import cn.zyq.ykb.system.common.CacheService;
import cn.zyq.ykb.system.common.PageParam;
import com.github.pagehelper.PageInfo;

import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.List;

public interface UserService extends CacheService<User> {
    PageInfo<User> list(PageParam pageParam, Admin admin);
    /**
     * 查询用户
     *
     * @param userID 用户主键
     * @return 用户
     */
    User selectUserByUserID(Integer userID);

    /**
     * 查询用户
     *
     * @param serviceID 用户业务ID
     * @return 用户
     */
    User selectUserByServiceID(String serviceID);

    /**
     * 查询用户列表
     *
     * @param pageParam
     * @param admin
     * @return 用户集合
     */
    PageInfo<User> selectUserList(PageParam pageParam,SysAdmin admin);

    /**
     * 查询用户列表
     *
     * @param param
     * @return 用户集合
     */
    List<User> selectUserList(User param);

    /**
     * 新增用户
     *
     * @param param 用户
     * @return 结果
     */
    int insertUser(User param);

    /**
     * 修改用户
     *
     * @param param 用户
     * @return 结果
     */
    int updateUser(User param);

    /**
     * 批量删除用户
     *
     * @param userIDs 需要删除的用户主键集合
     * @return 结果
     */
    int deleteUserByUserIDs(Integer[] userIDs);

    /**
     * 删除用户信息
     *
     * @param userID 用户主键
     * @return 结果
     */
    int deleteUserByUserID(Integer userID);
    void add(User param, Admin admin);

    void update(User param, Admin admin);

    void del(String serviceID, Admin admin);

    User detail(String serviceID, Admin admin);

    User detail(String serviceID);

    User detailByID(Integer userID);

    User getLoginUser(HttpServletRequest request);

    User wxLogin(WxLoginBo bo, HttpServletRequest request);

    /**
     * 获取用户手机哈
     *
     * @param code
     * @param loginUser
     * @return
     */
    Object getPhone(String code, User loginUser);

    /**
     * 更新用户头像昵称和性别等信息
     *
     * @param loginUser
     * @param user
     * @return
     */
    User updateInfo(User loginUser, User user);

    /**
     * 去更新用户的钱
     *
     * @param amount
     * @param userID
     * @return
     */
    int addWallet(BigDecimal amount, Integer userID);

    /**
     * 去更新用户的钱
     *
     * @param amount
     * @param userID
     * @return
     */
    int subWallet(BigDecimal amount, Integer userID);


    /**
     * 验证码登录
     * @param dto
     * @return
     */
    User smsLogin(UserLoginDto dto);

    /**
     * 个人信息
     *
     * @param phone @return
     * @param request
     */
    User person(String phone,HttpServletRequest request);

    /**
     * 修改头像
     * @param user
     * @param loginUser
     * @return
     */
    int updateHead(User user , User loginUser);

    /**
     * 获取刷新/置顶剩余数量
     * @param loginUser
     * @return
     */
    User getResidue(User loginUser);

    /**
     * 发送短信验证码
     * @param phone
     */
    Integer smsCode(String phone);

    /**
     * 绑定手机号
     * @param dto
     * @return
     */
    User bindPhone(UserLoginDto dto);

    /**
     * 输入邀请码
     * @param bo
     *
     */
    User fillInviteCode(FillInviteCodeBo bo);

    /**
     * 修改手机号
     * @param dto
     * @param loginUser
     * @return
     */
    User updatePhone(UserLoginDto dto, User loginUser);

    /**
     * 修改昵称
     * @param user
     * @param loginUser
     * @return
     */
    int uptName(User user, User loginUser);

    /**
     * 绑定支付宝账号
     *
     * @param bo
     * @param loginUser
     * @return
     */
    User bindAlipay(BindAlipayBo bo, User loginUser);

    /**
     * 获取导师微信
     * @param loginUser
     * @return
     */
    User getWxCode(User loginUser);

    /**
     * 我的团队
     * @param pageParam
     * @param loginUser
     * @return
     */
    PageInfo<User> getMyTeam(PageParam pageParam, User loginUser);


    List<Integer> queryUserID(List<Integer> userIDList, Integer userID);
    /**
     * 提现申请
     * @param param
     * @param loginUser
     * @param request
     * @return
     */
    UserCash withdraw(UserCash param, User loginUser,HttpServletRequest request);

    /**
     * 获取所有服务商
     * @return
     */
    List<User> getService();

    /**
     * 用户升级
     * @param bo
     * @param loginAdmin
     * @return
     */
    int upgrade(UserUpgradeBo bo, SysAdmin loginAdmin);

    /**
     * 修改团队
     * @param bo
     * @param loginAdmin
     * @return
     */
    int uptTeam(UserUptTeamBo bo, SysAdmin loginAdmin);

    /**
     * 余额变动
     * @param userID
     * @return
     */
    List<UserBalance> balanceRecord(Integer userID);

    /**
     * 修改支付宝账号
     * @param bo
     * @param loginUser
     * @return
     */
    User uptAlipay(BindAlipayBo bo, User loginUser);

    /**
     * 填写客服微信
     * @param customer
     * @param loginUser
     * @return
     */
    int addCustomer(String customer, User loginUser);

    /**
     * 调整比例
     * @param bo
     * @param loginUser
     * @return
     */
    int uptRatio(UserUptRatioBo bo, User loginUser);

    /**
     * 团队长收益
     * @param pageParam
     * @param loginUser
     * @return
     */
    PageInfo<User> income(PageParam pageParam, User loginUser);

    /**
     * 添加团队长
     * @param pageParam
     * @param loginUser
     * @return
     */
    PageInfo<User> addIncome(PageParam pageParam, User loginUser);

    /**
     * 获取团队长名额
     * @param loginUser
     * @return
     */
    User getNumber(User loginUser);

    /**
     * 升级
     * @param bo
     * @param loginUser
     * @return
     */
    int upgradation(UserUpgradeBo bo, User loginUser);

    /**
     * 获取比例
     * @param loginUser
     * @return
     */
    ConfigBrokerage getRatio(User loginUser);

    /**
     * 平台打款
     * @param userID
     * @param amount
     * @param loginAdmin
     * @return
     */
    int payment(Integer userID, BigDecimal amount,SysAdmin loginAdmin);

    /**
     * 调整下级团队长数量
     * @param user
     * @param loginSysAdmin
     * @return
     */
    User uptTzdNumber(User user, SysAdmin loginSysAdmin);

    /**
     * 获取注册用户数量
     * @return
     * @param admin
     */
    GetUserNumberVo getUserNumber(SysAdmin admin);

    /**
     * 一周注册用户数量变化
     * @param time
     * @param admin
     * @return
     */
    List<GetUserVo> getRegisterNumber(String time,SysAdmin admin);


    MyTem getMyTeamTotal(User loginUser);

    /**
     * 获取我的团队团队长数据
     *
     * @param loginUser
     * @return
     */
    List<User> getMyTuz(User loginUser);

    BigDecimal getMoney(User loginUser);

    BigDecimal getYXMoney(User loginUser);

    BigDecimal getRWMoney(User loginUser);

    BigDecimal getKCMoney(User loginUser);

    PageInfo<UserWalletDetailVo> getKCDetail(PageParam pageParam, User loginUser);
}
